Skip to content

ci(release): drop goreleaser (Pro-only prebuilt) — inline cosign + gh release#50

Merged
aksOps merged 1 commit intomainfrom
ci-release-drop-goreleaser
Apr 23, 2026
Merged

ci(release): drop goreleaser (Pro-only prebuilt) — inline cosign + gh release#50
aksOps merged 1 commit intomainfrom
ci-release-drop-goreleaser

Conversation

@aksOps
Copy link
Copy Markdown
Contributor

@aksOps aksOps commented Apr 23, 2026

Problem

Manual release runs (v0.0.3) have been failing with:

```
yaml: unmarshal errors:
line 19: field prebuilt not found in type config.Build
```

Root cause

`.goreleaser.yaml` used `builder: prebuilt` + `prebuilt.path:` which is a GoReleaser Pro feature. The OSS goreleaser pinned by `goreleaser-action` doesn't parse those fields.

From upstream docs: "GoReleaser Pro also supports continuously releasing nightly builds and importing pre-built binaries using the prebuilt builder."

Fix

Drop goreleaser entirely. The matrix build job already produces native binaries (linux-amd64 on ubuntu, darwin-arm64 on macos) because CGO + sqlite-vec doesn't cross-compile cleanly. The release job now inlines the packaging steps:

  1. Download pre-built binaries
  2. Rename to `docsiq---`
  3. Compute `SHA256SUMS`
  4. Sign each binary + SHA256SUMS with cosign keyless (Sigstore + Rekor)
  5. Draft GitHub release with `--generate-notes` (uses `.github/release.yml` categories)
  6. Append a cosign `verify-blob` footer to the notes, publish
  7. Generate SLSA build provenance via `actions/attest-build-provenance`
  8. Upload the `.intoto.jsonl` bundle to the release

What's preserved

  • ✅ Signed binaries (cosign keyless, Rekor-anchored)
  • ✅ Signed SHA256SUMS
  • ✅ SLSA build provenance
  • ✅ Auto-generated release notes with security/breaking/features/bugs categories (via `.github/release.yml`)
  • ✅ Scorecard Signed-Releases = 10/10
  • ✅ Scorecard Packaging — confirmed by recent Scorecard run: "Info: Project packages its releases by way of GitHub Actions.: .github/workflows/release.yml:139". Scorecard's Packaging detector matches on release workflows generically (`gh release create`, `softprops/action-gh-release`, goreleaser, etc.) — it does not require goreleaser specifically.

What's lost

Nothing material. Trade-off is simpler, predictable release pipeline.

Files

  • `.github/workflows/release.yml` — release job rewritten (-95 / +57 lines)
  • `.goreleaser.yaml` — removed

Test plan

  • Merge this PR
  • Delete the stale `v0.0.3` tag (currently points to a commit with no associated release)
  • Run `gh workflow run release.yml --ref main -f bump=patch`
  • Verify release page: binaries + .sig + .pem + SHA256SUMS + SHA256SUMS.sig + .intoto.jsonl all uploaded
  • Verify `cosign verify-blob` succeeds against an uploaded binary using its .pem/.sig
  • Next Scorecard run still flags Packaging as detected

🤖 Generated with Claude Code

…elease

The release workflow was failing with:
  yaml: unmarshal errors:
    line 19: field prebuilt not found in type config.Build

Root cause: the `builder: prebuilt` + `prebuilt.path` config used in
.goreleaser.yaml is a GoReleaser Pro-only feature, not supported by
OSS goreleaser (which is what the goreleaser-action pins).

Rather than buying Pro, inline the release steps directly — the
matrix build job already produces native binaries (linux-amd64 on
ubuntu, darwin-arm64 on macos); the release job now:

  1. Downloads the pre-built binaries
  2. Renames them to docsiq-<tag>-<os>-<arch>
  3. Computes SHA256SUMS
  4. Signs each binary + SHA256SUMS with cosign keyless (Sigstore)
  5. Creates a draft GitHub release with auto-generated notes
  6. Appends a cosign verify footer to the notes, publishes
  7. Generates SLSA build provenance attestation
  8. Uploads the provenance bundle to the release

What we keep:
  - Signed binaries (cosign keyless + Rekor transparency log)
  - Signed SHA256SUMS
  - SLSA build provenance
  - Auto-generated GitHub release notes (grouped via .github/release.yml)

What we lose:
  - Scorecard "Packaging" signal (goreleaser detection) — acceptable
    trade; everything Scorecard actually checks for signed releases
    (Signed-Releases) still works.

.goreleaser.yaml is removed as unused.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@aksOps aksOps merged commit b440914 into main Apr 23, 2026
11 checks passed
@aksOps aksOps deleted the ci-release-drop-goreleaser branch April 23, 2026 07:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant